HUDMode
首先来看MBProgressHUD的几种显示模式:
|
|
核心API
属性
|
|
显示逻辑
MBProgressHUD作者把方法的定义放在最上面,而很多人是把属性放在方法上面,这只是习惯问题,无伤大雅:
|
|
调用showAnimated,这里首先进行线程安全判断,因为对于 UIView 的处理必须在主线程中, 所以在这里要先用 [NSThread isMainThread] 来确认当前前程为主线程,而 MBMainThreadAssert()就是一个主线程安全判断的宏定义:
|
|
这里需要说的一点,showUsingAnimation方法设置了NSProgress的监听方法,来防止程序多次显示同一Hud时的progress值错误,这里使用CADisplayLink 来刷新progress的变化。那么会有人问了为什么没有使用NSTimer和KVO呢?因为CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高,并且不需要关心屏幕的刷新频率,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染;而NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期;如果使用kvo机制来监听的话,因为动画刷新频率比较快,可能会非常消耗主线程,拖重性能:
|
|
隐藏逻辑
+ hideHUDForView:animated:方法的实现和 + showHUDAddedTo:animated:差不多,而+ HUDForView:方法会返回对应 view 最上层的 MBProgressHUD 的实例。
|
|
然后调用的- hideAnimated: 方法和 - hideUsingAnimation:方法,来实现hud的隐藏,同样- hideUsingAnimation:方法也是每个隐藏方法的必调核心方法,而只有在 HUD 隐藏之后 - done 负责隐藏执行completionBlock和 delegate的回调:
|
|
通过观察hud的显示和隐藏逻辑不难看出,无论是 show 方法,还是 hide 方法,在设定animated属性为YES的前提下,最终都会走到 animateIn: withType: completion: 方法:
|
|
此框架可取之处:
1、代码的质量非常高,方法的抽象程度高,但是不繁琐,暴露对外的API最终走向同一个私有方法,这种设计思想,使得框架维护起来十分方便快捷。
2、设计显示上加上的graceTimer、minShowTimer、hideDelayTimer的概念,使得hud的显示与隐藏有了缓冲的时间,可以提高稳定性和定制性。